﻿#ifndef __SHAPE_H__
#define __SHAPE_H__

#include <QPoint>
#include <QWidget>
#include <QPainter>

enum class ShapeType
{
	Rhomboid,
	Rectangle,
	RoundedRect,
	Circle,
	Cloud
};


class Shape : public QWidget
{
	Q_OBJECT
protected:
	//起点坐标(对应左上角坐标，利用高度和宽度可计算右下角坐标)
	QPoint start_point;
	//图形宽度
	int shape_width;
	//图形高度
	int shape_height;
	//图形画笔
	QPen shape_pen;
	//图形画刷
	QBrush shape_brush;
	//结点编号
	int nodes_index;
	//结点半径
	int circle_radius = 5;
public:
	//构造函数
	explicit Shape(QWidget* parent = nullptr);
	//绘制图形：需要根据图形具体形状和宽高分情况绘制
	virtual void paintPixmap(QPainter& painter) = 0;
	//绘制结点：悬浮状态下显示出来，可以从此拉出连线
	virtual void paintCircle(QPainter& painter) = 0;
	//点击判断：给出鼠标的点击坐标，判断是否在图形内
	virtual bool clickDetect(const QPoint& point) = 0;
	//结点检测：给出鼠标的点击坐标，判断是否在结点内
	virtual bool nodesDetect(const QPoint& point) = 0;
	//范围检测：给出鼠标的选中区域，判断是否完全包含
	virtual bool scopeDetect(const QPoint& point, int width, int height);
	//设置结点
	virtual void setNodeIndex(const QPoint& point) = 0;
	//获得结点
	virtual void getNodePoint(QPoint& point, int index) const = 0;
	//设置起点
	void setStartPoint(const QPoint& point);
	//设置宽度
	void setShapeWidth(int width);
	//设置高度
	void setShapeHeight(int height);
	//X最小值
	int getMinX() const;
	//X最大值
	int getMaxX() const;
	//Y最小值
	int getMinY() const;
	//Y最大值
	int getMaxY() const;
	//图形宽度
	int getWidth() const;
	//图形高度
	int getHeight() const;
	//结点索引
	int getNode() const;
	//图形类型
	virtual ShapeType getType() const = 0;
	//默认比例：在未设置宽高的情况下，希望图形保持的宽高比例
	virtual double getRate() = 0;
};


//记录两个图形之间的结点链接情况，如果某个链接没有结束图形则使用结束坐标
class ShapeLink : public QObject
{
private:
	//起点图形
	Shape* start_shape;
	//起点图形结点索引
	int start_index;
	//结束图形
	Shape* final_shape;
	//结束图形结点索引
	int final_index;
	//结束坐标
	QPoint final_point;
public:
	//起点图形和起点索引必须在构造时完成
	ShapeLink(QObject* parent, Shape* s_shape, int s_index);
	void setFinalShape(Shape* f_shape);
	void setFinalPoint(QPoint f_point);
	void setFinalIndex(int f_index);
	Shape* getStartShape() const;
	Shape* getFinalShape() const;
	QPoint getFinalPoint() const;
	int getFinalIndex() const;
	int getStartIndex() const;
};


#endif // !__SHAPE_H__
